package com.atguigu.flink.datastramapi.source;

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;

import java.util.Arrays;

/**
 * Created by Smexy on 2023/2/24
 *  1.14后推荐使用的。
 *      1.13可以用
 *
 *      KafkaSource
 */
public class Demo3_KafkaSourceNew
{
    public static void main(String[] args) {


        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        env.setParallelism(1);


        /*
            创建KafkaSource

            <OUT> KafkaSourceBuilder<OUT> builder(): 称为泛型方法。
                    OUT: 从kafka读完数据后，向下游输出的类型。

                调用泛型方法时，需要显式在方法名字前，添加泛型。
                    <T>builder()

                 OffsetsInitializer.earliest(): 从主题最早位置读
                 OffsetsInitializer.latest(): 从主题最新位置读
                 OffsetsInitializer.committedOffsets(): 从已经提交的位置读。 没有提交过？默认从最后位置读
                 OffsetsInitializer.committedOffsets(OffsetResetStrategy.EARLIEST): 从已经提交的位置读。 没有提交过？默认从最新位置读

         */
        KafkaSource<String> kafkaSource = KafkaSource
            .<String>builder()
            .setBootstrapServers("hadoop102:9092")
            .setGroupId("atguigu")
            .setTopics("topicA")
            //额外设置消费者参数
            //.setProperty()
            //数据都在value中，key无所谓。key一般在生产者中用来分区。
            .setValueOnlyDeserializer(new SimpleStringSchema())
            .setStartingOffsets(OffsetsInitializer.latest())
            .build();

         /*
            使用kafkasource

            Source<OUT, ?, ?> source,
            WatermarkStrategy<OUT> timestampsAndWatermarks: 水印策略（后续讲）。
            String sourceName： 起名字
          */
         env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(),"kafka")
            .print();


        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
